package com.hmdp.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * redis id生成器
 * 特征：
 */
@Component
public class RedisIdWorker {

    long beginTime = 1661702672L;

    final StringRedisTemplate stringRedisTemplate;

    public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    /**
     * 算法思路:
     * 全局id生成器需要满足以下几个要求： 全局唯一性、递增性、生成效率高、且不容易被看出规律(看出规律容易被部
     * 人员推测出系统的一些信息)。
     * 这里生成id的思路： id由64位组成，第1位为符号位，为0 2-32位为时间戳，位当前时间-beginTime
     * 33-64位为递增id。 每天的递增id都会重新从0开始(这里借助redis的递增来实现)
     * @param businessPrefix 业务系统前缀，每个系统可以传入不同
     */
    public long nextId(String businessPrefix) {
        LocalDateTime now = LocalDateTime.now();
        long nowTime = now.toEpochSecond(ZoneOffset.UTC);  //UTC 世界协调时间
        long timeStamp = nowTime - beginTime;
        String timeField = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        long count = stringRedisTemplate.opsForValue().increment(businessPrefix + "" + timeField);
        return timeStamp << 32 | count;
    }

}
